package com.pe.pgn.clubpgn.dao.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.dao.StockReservaDao;
import com.pe.pgn.clubpgn.dao.hibernate.GenericDaoHibernate;
import com.pe.pgn.clubpgn.domain.ClpmReservaMovStock;
import com.pe.pgn.clubpgn.domain.beans.BNDocumentoMovArticulo;
import com.pe.pgn.clubpgn.webapp.util.ValidationUtil;

@Repository("stockReservaDao")
public class StockReservaDaoImpl extends GenericDaoHibernate<ClpmReservaMovStock, Long> implements StockReservaDao{

	private JdbcTemplate jdbcTemplate;
	
	@Autowired
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}
	
	public StockReservaDaoImpl() {
		super(ClpmReservaMovStock.class);
	}

	@SuppressWarnings("unchecked")
	public List<BNDocumentoMovArticulo> busquedaReserva(String coEstacionUsuario, 
		String stHabilitado, String stTipoDoc, String flagIngresado) {

		String codeAlmacen = "";
		String strFechaDoc = "to_char(cast(" +
		"dma.da_fecha_documento as date),  " +
		"'"+CLPConstantes.DATE_PATTERN+"')";
		
		if (StringUtils.isNotBlank(coEstacionUsuario) && !"-1".equals(coEstacionUsuario))			
		codeAlmacen = obtenerCodigoAlmacenPorEstacion(coEstacionUsuario);
		
		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append("  dma.id ");
		query.append(" ,dma.nu_serie 		 as nuSerie ");
		query.append(" ,dma.nu_documento 	 as nuDocumento ");
		query.append(" ,dma.st_indicador_tipo_documento as stIndicatorTipoDoc ");
		query.append(" ,almacen.de_almacen 	 as deAlmacen   ");
		query.append(" ,estacion.de_estacion as deEstacion  ");		
		query.append(" ,articulo.de_articulo as dePremio    ");
		query.append(" ,catalogo.de_catalogo as deCatalogo  ");
		query.append(" ,"+strFechaDoc+" as daFechaDocumento ");
		query.append(" ,dma.co_cod_tarjeta_persona_canje as codTarjeta ");
		query.append(" ,dma.st_documento_mov_articulo as stDocumentoMovArt ");		
		query.append(" ,cliente.de_nombre||' '|| cliente.de_ape_paterno||' '||cliente.de_ape_materno as deCliente ");
		
		query.append(" from clpb_documento_mov_articulo dma ");
		query.append(" left join clpd_documento_mov_articulo dtl ");
		query.append(" 		on dtl.co_documento_mov_articulo = dma.id ");
		query.append(" left join clpb_cliente_persona cliente ");
		query.append(" 		on cliente.id = dma.co_cliente_persona ");
		query.append(" inner join clpb_almacen almacen ");
		query.append(" 		on almacen.id = dma.co_almacen ");
		query.append(" inner join clpb_estacion estacion ");
		query.append(" 		on estacion.id = almacen.co_estacion ");
		query.append(" left join clpd_articulo articulo ");
		query.append(" 		on articulo.id = dtl.co_articulo ");
		query.append(" left join clpm_catalogo catalogo ");
		query.append(" 		on catalogo.id = dma.co_catalogo ");
		query.append(" left join clpr_premio_catalogo premcat ");
		query.append(" 		on  premcat.id = dtl.co_premio ");
		query.append(" 		and premcat.co_premio = dtl.co_articulo ");
		
		if(CLPConstantes.NO_INGRESADO.equalsIgnoreCase(flagIngresado)){
			query.append("  where dma.id not in ");	
		}else{
			query.append("  where dma.id in ");
		}
		
		query.append(" (select co_documento_mov_articulo from clpm_reserva_mov_stock where st_reserva_mov_stock = '"+CLPConstantes.ST_VERDADERO+"') ");
		query.append(" and articulo.st_maneja_stock_alm_principal = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" and dma.nu_doc_entrega_reserva is null ");
		
		if (StringUtils.isNotBlank(codeAlmacen) && !"null".equals(codeAlmacen))
		query.append(" and dma.co_almacen = ").append(codeAlmacen);
		
		if (StringUtils.isNotBlank(stHabilitado) && !"-1".equals(stHabilitado)){
			query.append(" and dma.st_documento_mov_articulo = ").append("'"+stHabilitado+"'");
		}else{
			query.append(" and dma.st_documento_mov_articulo = ").append("'"+CLPConstantes.ST_VERDADERO+"'");
		}
		
		if(CLPConstantes.ST_DOCUMENTO_RESERVA.equals(stTipoDoc)){
			query.append(" and dma.st_indicador_tipo_documento = ").append("'"+CLPConstantes.ST_DOCUMENTO_RESERVA+"'");
		}else if(CLPConstantes.ST_DOCUMENTO_CANJE.equals(stTipoDoc)){
			query.append(" and dma.st_indicador_tipo_documento = ").append("'"+CLPConstantes.ST_DOCUMENTO_CANJE+"'");
		}else{
			query.append(" and (dma.st_indicador_tipo_documento = ").append("'"+CLPConstantes.ST_DOCUMENTO_CANJE+"'");
			query.append(" or dma.st_indicador_tipo_documento = ").append("'"+CLPConstantes.ST_DOCUMENTO_RESERVA+"' )");
		}
		
		query.append(" group by ");
		query.append(" 	  dma.id ");
		query.append(" 	 ,dma.nu_serie ");
		query.append(" 	 ,dma.nu_documento ");
		query.append("   ,dma.st_indicador_tipo_documento ");
		query.append(" 	 ,almacen.de_almacen ");
		query.append(" 	 ,estacion.de_estacion ");
		query.append(" 	 ,articulo.de_articulo ");
		query.append(" 	 ,catalogo.de_catalogo ");
		query.append(" 	 ,dma.da_fecha_documento ");
		query.append(" 	 ,dma.co_cod_tarjeta_persona_canje ");
		query.append(" 	 ,dma.st_documento_mov_articulo ");
		query.append(" 	 ,cliente.de_nombre||' '|| cliente.de_ape_paterno||' '||cliente.de_ape_materno ");
		query.append(" order by dma.da_fecha_documento desc ");
		
		System.out.println("*** StockReservaDaoImpl.busquedaReserva() --> "+query.toString());
		return findListOfBeans(query.toString(), null, BNDocumentoMovArticulo.class);
	}

	@SuppressWarnings("unchecked")
	private String obtenerCodigoAlmacenPorEstacion(String codeEstacion) {

		StringBuffer query = new StringBuffer();
		query.append(" select id ");
		query.append(" from clpb_almacen ");
		query.append(" where co_estacion = ").append(codeEstacion);
		query.append(" and st_almacen = '").append(CLPConstantes.ST_VERDADERO).append("'");
		
		List list = findListOfMaps(query.toString(), null);
		if(!list.isEmpty()){
			Map map = (HashMap)list.get(0);
			return String.valueOf(map.get("id"));
		}else{
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public Map guardarStockIngresado(
			List<BNDocumentoMovArticulo> documentoDetalle) {

		Map mapMessage = new HashMap();
		
		try{
			
			String codes = "";
			List listCodes = new ArrayList();
			
			for (BNDocumentoMovArticulo bnDocumentoMovArticulo : documentoDetalle) {
				if(bnDocumentoMovArticulo.isStIngresado()){
					codes += bnDocumentoMovArticulo.getId()+",";
					listCodes.add(bnDocumentoMovArticulo.getId().toString());
				}
			}
			
			if(codes.length() > 0){
				codes = codes.substring(0,codes.length()-1);
			}else{
				codes = "-1";
			}
			
			StringBuffer query = new StringBuffer();
			query.append(" select ");
			query.append(" co_documento_mov_articulo ");
			query.append(" from clpm_reserva_mov_stock ");
			query.append(" where co_documento_mov_articulo in ("+codes+")");
			
			List list = jdbcTemplate.queryForList(query.toString());
			if(!ValidationUtil.validateList(list)){
				list = new ArrayList();
			}
			
			String[] arrayUpdate = new String[list.size()];			
			for (int i = 0; i < list.size(); i++) {
				
				Map map = (Map)list.get(i);
				query = new StringBuffer();
				
				query.append(" update clpm_reserva_mov_stock ");
				query.append(" set st_reserva_mov_stock = '"+CLPConstantes.ST_VERDADERO+"', ");
				query.append(" 	   co_usuario_modificador = '"+getUsuarioLogueado().getUsername()+"', ");
				query.append(" 	   da_fecha_modificacion  = sysdate ");
				query.append(" where co_documento_mov_articulo = ").append(map.get("co_documento_mov_articulo"));
				
				listCodes.remove(map.get("co_documento_mov_articulo").toString());
				arrayUpdate[i] = query.toString();
			}				
			
			String[] arrayInsert = new String[listCodes.size()];
			for (int i = 0; i < listCodes.size(); i++) {
				
				String coDocumentoMovArticulo = listCodes.get(i).toString();
				query = new StringBuffer();
				
				query.append(" insert into clpm_reserva_mov_stock ");
				query.append(" (id, co_documento_mov_articulo, st_reserva_mov_stock, co_usuario_creador, da_fecha_creacion) ");
				query.append(" values (SEQ_RESERVA_MOV_STOCK.nextVal, "+coDocumentoMovArticulo+",'"+CLPConstantes.ST_VERDADERO+"',");
				query.append(" '"+getUsuarioLogueado().getUsername()+"', sysdate)");
				
				arrayInsert[i] = query.toString();
			}
			
			if(arrayUpdate.length > 0)
			jdbcTemplate.batchUpdate(arrayUpdate);
			
			if(arrayInsert.length > 0)
			jdbcTemplate.batchUpdate(arrayInsert);
			
			mapMessage.put("msg", "success");
			
		}catch(Exception e){
			
			mapMessage.put("msg", "error");
			mapMessage.put("dtl", e.getMessage());
		}
		
		return mapMessage;
	}

	@SuppressWarnings("unchecked")
	public Map guardarStockNoIngresado(List<BNDocumentoMovArticulo> documentoDetalle) {

		Map mapMessage = new HashMap();
		
		try{
			
			List listCodes = new ArrayList();
			for (BNDocumentoMovArticulo bnDocumentoMovArticulo : documentoDetalle) {
				if(bnDocumentoMovArticulo.isStNoIngresado()){
					listCodes.add(bnDocumentoMovArticulo.getId().toString());
				}
			}
			
			String[] arrayUpdate = new String[listCodes.size()];			
			for (int i = 0; i < listCodes.size(); i++) {
				
				String coDocumentoMovArticulo = listCodes.get(i).toString();
				StringBuffer query = new StringBuffer();
				
				query.append(" update clpm_reserva_mov_stock ");
				query.append(" set st_reserva_mov_stock = '"+CLPConstantes.ST_FALSO+"', ");
				query.append(" 	   co_usuario_modificador = '"+getUsuarioLogueado().getUsername()+"', ");
				query.append(" 	   da_fecha_modificacion  = sysdate ");
				query.append(" where co_documento_mov_articulo = ").append(coDocumentoMovArticulo);
				
				arrayUpdate[i] = query.toString();
			}				
			
			if(arrayUpdate.length > 0)
			jdbcTemplate.batchUpdate(arrayUpdate);
			
			mapMessage.put("msg", "success");
			
		}catch(Exception e){
			
			mapMessage.put("msg", "error");
			mapMessage.put("dtl", e.getMessage());
		}
		
		return mapMessage;
	}
}
